package com.sofwin.system.controller;

import com.google.code.kaptcha.Constants;
import com.sofwin.common.ResponseEntry;
import com.sofwin.pojo.SysUser;
import com.sofwin.system.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

/**
 * @packageName: com.sofwin.system.controller
 * @user: andyliu
 * @date: 2021/12/14 10:55
 * @email 115176513@qq.com
 * @description: 登录，退出
 */
@RestController
@RequestMapping("/login")
public class LoginController {
    @Autowired
    private UserService userService;
    @PostMapping
    public ResponseEntry login(SysUser user, String code, HttpSession session){
//        Object obj = session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
//        if(obj==null){
//            return ResponseEntry.error("非法登录");
//        }else{
//            if(!obj.toString().equals(code)){
//                return  ResponseEntry.error("验证码输入错误");
//            }
//        }

//        // 调用业务逻辑判断登录
//        SysUser currUser = userService.checkLogin(user);
//        if(currUser==null){
//            return ResponseEntry.error("登录失败");
//        }
        // 通过安全工具获取当前登录的主体
        Subject subject = SecurityUtils.getSubject();
        // token 令牌
        // jwt 令牌技术  包含用户的实效时间
        // 0000011688888   解密  long ---> date
        // 拦截器
        // 0000011688888  long -->date 如果时间没有>当前时间
        // jwt的规则重写生成时间---> 字符串--->写入客户端
        UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginAccount(),user.getLoginPwd());
        // 如果该方法没有抛出任何异常，说明认证成功
        // 如果抛出异常，可以根据异常来判断认证失败的原因
        try {
            subject.login(token);// 进行认证的方法，会自动调用realm中的认证方法
        }catch (UnknownAccountException ex){
            // 说明用户名不存在
            return ResponseEntry.error("用户名不存在");
        }catch (LockedAccountException ex){
            // 账户被锁定
            return ResponseEntry.error("账户被锁定");
        }catch (IncorrectCredentialsException ex){
            // 密码错误
            return ResponseEntry.error("密码错误");
        }
        return ResponseEntry.success("登录成功");

    }

    @GetMapping("logout")
    public ResponseEntry logout(HttpSession session){
        session.removeAttribute(com.sofwin.Constants.CURR_USER);
        return ResponseEntry.success("退出成功");
    }
}
